NimでSlackBotを作った (nimbot)
作りたいなぁと思ってから2時間くらいで作った
結局その後全部dockerコンテナ化したのでめちゃくちゃ時間かかったが 成果物
https://gyazo.com/802f58257bea038b1644ab67a5e4eed9
ソースコード
使い方
こんな感じでNimのコードを書いて送信すると、バックエンドでNimのコードをコンパイルして実行して、その結果を返す
code:nim
/nimbot
echo "hello"
仕組み
処理フロー
https://gyazo.com/16c4c6a35fe325e087de8abf8ca5f877
Slackのチャットから/nimbotコマンドでテキストを送る
僕が運用している特定のサーバにPOSTリクエストが飛ぶ
チャット送信主にokだけ返す
コードをファイル出力し、Dockerコンテナ上でnimコンパイラに渡して実行
実行結果をIncomingWebhookのURLにPOST
画面に結果が出力される
なぜこんな作りにしたか
slash-commandsにはタイムアウト時間3秒という制限があった
Nimのコードをコンパイルして実行する+Dockerコンテナが起動する時間を含めると3秒では時間が足りない 非同期に処理するために一旦DBに保存だけしてレスポンスを返すようにした
slash-commandsのみだと、コマンドの実行結果がチャット主にしか表示されない
せっかくなのでチャット欄に実行結果を垂れ流したかった
余談
ほとんどwebshと同じような構成で作ったので、Nimのコードとかだいたいコピペで作った 初期リリース時はNimのコード実行部分だけDockerコンテナで動かしていた
それ以外はすべてホストPC上で動かしていた
ローカル開発のときに複数のサービスを起動する必要がでてきて、開発時の動作検証が難しくなってきた
ローカルにファイルを保存してそれをフラグにする構成もホストPCへの依存度を高くしている
すべてDockerコンテナで動かすようにアーキテクチャを再設計する方針に決定
2020/3/28 にようやくDockerコンテナ化が完了した 後からアーキテクチャを変更したので大改修だった
ログの出力書式の違いとかも統一したかったのでfluentdを使うことにした